package com.insa.flopenshop;

/**
 * Classe très simple qui permet juste de stocker une sous tache
 * 
 * @author Luc DUZAN
 * 
 */
public class SousTache implements Comparable<SousTache>{

	private final int tache;
	private final int ressourceDedie;
	private final Instance instance;

	/**
	 * @param instance instance qui possède cette sous tache
	 * @param tache numéro de la tache correspondant à la tache
	 * @param ressourceDedie numéro de la ressource dédié sur laquelle la sous tache doit être effectué
	 */
	public SousTache(Instance instance, int tache, int ressourceDedie) {
		this.tache = tache;
		this.instance = instance;
		this.ressourceDedie = ressourceDedie;
	}

	/**
	 * 
	 * @return numéro de la tache correspondant à la tache
	 */
	public int getTache() {
		return tache;
	}

	@Override
	public String toString() {
		return "SousTache [tache=" + tache + ", ressourceDedie="
				+ ressourceDedie + "]";
	}

	/**
	 * 
	 * @return numéro de la ressource dédié sur laquelle la sous tache doit être effectué
	 */
	public int getRessourceDedie() {
		return ressourceDedie;
	}
	
	public int getTime() {
		return instance.getTime(this);
	}

	@Override
	//code généré par eclipse
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ressourceDedie;
		result = prime * result + tache;
		return result;
	}

	@Override
	//code généré par eclipse
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SousTache other = (SousTache) obj;
		if (ressourceDedie != other.ressourceDedie)
			return false;
		if (tache != other.tache)
			return false;
		return true;
	}

	@Override
	public int compareTo(SousTache o) {
		int result;
		result = this.getTime() - o.getTime();
		
		if(result == 0) {
			result = this.tache - o.tache;
			if(result == 0) {
				result = this.ressourceDedie - o.ressourceDedie;
			}
		}
		
		return result;
	}

	/**
	 * Retourne false si et seulement si sousTache peut être placé en même temps que this
	 * @param sousTache
	 * @return 
	 */
	public boolean enConflitAvec(SousTache sousTache) {
		return this.ressourceDedie == sousTache.ressourceDedie || this.tache == sousTache.ressourceDedie;
	}
}
